{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "hi"
   },
   "source": [
    "# Syft Keras सह खाजगी भविष्यवाण्या  (Private Predictions with Syft Keras)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "hi"
   },
   "source": [
    "# चरण 1: सार्वजनिक प्रशिक्षण\n",
    "\n",
    "\n",
    "या पाठात आपले स्वागत आहे! पुढील नोटबुकमध्ये आपण खाजगी अंदाज कसे द्यायचे ते शिकाल. खाजगी अंदाजानुसार, आमचा अर्थ असा आहे की संपूर्ण प्रक्रियेमध्ये डेटा सतत कूटबद्ध केला जातो. कोणत्याही क्षणी वापरकर्ता कच्चा डेटा सामायिक करत नाही, केवळ कूटबद्ध केलेला (म्हणजे गुप्त सामायिक) डेटा आहे. ही खाजगी भविष्यवाणी करण्यासाठी, `Syft Keras` हूड च्या खाली [TF Encrypted](https://github.com/tf-encrypted/tf-encrypted) नावाची लायब्ररी वापरते. TF एन्क्रिप्टेड मध्ये अत्याधुनिक क्रिप्टोग्राफिक आणि मशीन लर्निंग तंत्र एकत्रित केले आहे, परंतु आपल्याला याबद्दल काळजी करण्याची आवश्यकता नाही आणि आपल्या मशीन लर्निंग अनुप्रयोगावर लक्ष केंद्रित करू शकता.\n",
    "\n",
    "आपण केवळ तीन चरणांसह खाजगी भविष्यवाण्या देण्यास प्रारंभ करू शकता:\n",
    "\n",
    "- **चरण 1**: आपल्या मॉडेलला सामान्य केरास प्रशिक्षण द्या.\n",
    "- **चरण 2**: आपल्या मशीन लर्निंग मॉडेलला (सर्व्हर) सुरक्षित करा आणि सर्व्ह करा.\n",
    "- **चरण 3**: खासगी अंदाज (क्लायंट) प्राप्त करण्यासाठी सुरक्षित मॉडेलची चौकशी करा.\n",
    "\n",
    "ठीक आहे, चला या तीन चरणांमध्ये जाऊ या म्हणजे आपण वापरकर्त्याची गोपनीयता किंवा मॉडेल सुरक्षिततेचा बळी न देता प्रभावी मशीन लर्निंग सेवा तैनात करू शकता.\n",
    "\n",
    "लेखक:\n",
    "- Jason Mancuso - Twitter: [@jvmancuso](https://twitter.com/jvmancuso)\n",
    "- Yann Dupis - Twitter: [@YannDupis](https://twitter.com/YannDupis)\n",
    "- Morten Dahl - Twitter: [@mortendahlcs](https://github.com/mortendahlcs)\n",
    "\n",
    "अनुवादक/संपादक:\n",
    "- Krunal Kshirsagar - Twitter: [@krunal_wrote](https://twitter.com/krunal_wrote) - Github: [@Noob-can-Compile](https://github.com/Noob-can-Compile)\n",
    "\n",
    "इनकी ओर से:\n",
    "- Dropout Labs - Twitter: [@dropoutlabs](https://twitter.com/dropoutlabs)\n",
    "- TF Encrypted - Twitter: [@tf_encrypted](https://twitter.com/tf_encrypted)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "hi"
   },
   "source": [
    "## आपल्या मॉडेलला Keras सह प्रशिक्षण द्या"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "hi"
   },
   "source": [
    "आपल्या प्रकल्पांसाठी गोपनीयता-संरक्षित मशीन लर्निंग तंत्र वापरण्यासाठी आपल्याला नवीन मशीन लर्निंग फ्रेमवर्क शिकण्याची गरज नाही. आपल्याकडे [Keras](https://keras.io/) चे  मूलभूत ज्ञान असल्यास आपण Syft Keras द्वारे या तंत्रे वापरण्यास प्रारंभ करू शकता. जर आपण यापूर्वी कधीही Keras वापरला नसेल तर आपण [Keras प्रलेखन](https://keras.io) द्वारे त्याबद्दल थोडेसे जाणून घेऊ शकता.\n",
    "\n",
    "खाजगी अंदाज देण्यापूर्वी, पहिली पायरी म्हणजे आपल्या मॉडेलला सामान्य केरास प्रशिक्षण देणे. उदाहरणार्थ, आम्ही हस्तलिखित अंकांचे वर्गीकरण करण्यासाठी मॉडेलला प्रशिक्षण देऊ. हे मॉडेल प्रशिक्षित करण्यासाठी आम्ही अधिकृत [MNIST डेटासेट](http://yann.lecun.com/exdb/mnist/) वापरू.\n",
    "\n",
    "हे उदाहरण आम्ही [केरास रेपॉजिटरी](https://github.com/keras-team/keras/blob/master/examples/mnist_cnn.py) मधून घेत आहोत. आपल्या वर्गीकरण मॉडेलचे प्रशिक्षण घेण्यासाठी आपण फक्त खालील सेल चालवा."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from __future__ import print_function\n",
    "import tensorflow.keras as keras\n",
    "from tensorflow.keras.datasets import mnist\n",
    "from tensorflow.keras.models import Sequential\n",
    "from tensorflow.keras.layers import Dense, Dropout, Flatten\n",
    "from tensorflow.keras.layers import Conv2D, AveragePooling2D\n",
    "from tensorflow.keras.layers import Activation\n",
    "\n",
    "batch_size = 128\n",
    "num_classes = 10\n",
    "epochs = 2\n",
    "\n",
    "# input image dimensions\n",
    "img_rows, img_cols = 28, 28\n",
    "\n",
    "# the data, split between train and test sets\n",
    "(x_train, y_train), (x_test, y_test) = mnist.load_data()\n",
    "\n",
    "x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)\n",
    "x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)\n",
    "input_shape = (img_rows, img_cols, 1)\n",
    "\n",
    "x_train = x_train.astype('float32')\n",
    "x_test = x_test.astype('float32')\n",
    "x_train /= 255\n",
    "x_test /= 255\n",
    "print('x_train shape:', x_train.shape)\n",
    "print(x_train.shape[0], 'train samples')\n",
    "print(x_test.shape[0], 'test samples')\n",
    "\n",
    "# convert class vectors to binary class matrices\n",
    "y_train = keras.utils.to_categorical(y_train, num_classes)\n",
    "y_test = keras.utils.to_categorical(y_test, num_classes)\n",
    "\n",
    "model = Sequential()\n",
    "\n",
    "model.add(Conv2D(10, (3, 3), input_shape=input_shape))\n",
    "model.add(AveragePooling2D((2, 2)))\n",
    "model.add(Activation('relu'))\n",
    "model.add(Conv2D(32, (3, 3)))\n",
    "model.add(AveragePooling2D((2, 2)))\n",
    "model.add(Activation('relu'))\n",
    "model.add(Conv2D(64, (3, 3)))\n",
    "model.add(AveragePooling2D((2, 2)))\n",
    "model.add(Activation('relu'))\n",
    "model.add(Flatten())\n",
    "model.add(Dense(num_classes, activation='softmax'))\n",
    "\n",
    "model.compile(loss=keras.losses.categorical_crossentropy,\n",
    "              optimizer=keras.optimizers.Adam(),\n",
    "              metrics=['accuracy'])\n",
    "\n",
    "model.fit(x_train, y_train,\n",
    "          batch_size=batch_size,\n",
    "          epochs=epochs,\n",
    "          verbose=1,\n",
    "          validation_data=(x_test, y_test))\n",
    "score = model.evaluate(x_test, y_test, verbose=0)\n",
    "print('Test loss:', score[0])\n",
    "print('Test accuracy:', score[1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "hi"
   },
   "source": [
    "## भविष्यातील खाजगी अंदाजासाठी आपल्या मॉडेलचे वजन जतन करा"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "hi"
   },
   "source": [
    "मस्त! आपले मॉडेल प्रशिक्षित आहे. `model.save()` सह मॉडेल वजनाची बचत करूया. पुढील नोटबुकमध्ये आम्ही खाजगी अंदाज वर्तविणे सुरू करण्यासाठी हे वजन वजन Syft Keras मध्ये लोड करू."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.save('short-conv-mnist.h5')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.5"
  },
  "nbTranslate": {
   "displayLangs": [
    "*"
   ],
   "hotkey": "alt-t",
   "langInMainMenu": true,
   "sourceLang": "en",
   "targetLang": "hi",
   "useGoogleTranslate": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}